package com.jt.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.util.ObjectMapperUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import redis.clients.jedis.JedisCluster;

import java.util.Date;
import java.util.UUID;

@Service    //使用dubbo的注解
public class DubboUserServiceImpl implements DubboUserService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private JedisCluster jedisCluster;


    /**
     * 注册入库
     * 密码加密
     * 邮箱使用手机代替
     * @param user
     */
    @Override
    public void insertUser(User user) {
        String password = user.getPassword();   //获取原密码
        password = DigestUtils.md5DigestAsHex(password.getBytes());     //使用MD5加密方式加密
        user.setPassword(password).setEmail(user.getPhone()).setCreated(new Date()).setUpdated(user.getCreated());
        userMapper.insert(user);
    }

    /**
     * 目的: 校验用户信息是否有效并且实现单点登录操作.
     * 步骤:
     *      1.校验用户名和密码是否正确(密码明文转化为密文)
     *      2.查询数据库检查是否有结果
     *      3.如果有结果,则动态生成TICKET信息(uuid),将user对象转化为JSON
     *      4.将数据保存到redis中,并且设定超时时间.
     *      5.返回当前用户登录的密钥.
     *
     * @param user
     * @return
     */
    @Override
    public String doLogin(User user) {
        String password = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username",user.getUsername())
                    .eq("password",password);
        User userDB = userMapper.selectOne(queryWrapper);
        //校验数据是否有效
        if (userDB==null){
            // 用户名或者密码错误返回空
            return null;
        }
        String ticket = UUID.randomUUID().toString().replace("-","");
        user.setPassword("敏感数据");
        String userJSON = ObjectMapperUtil.toJson(userDB);
        jedisCluster.setex(ticket,7*24*60*60,userJSON);
        return ticket;
    }


}
